// Package endpoint
// Title  			validation.endpoint.go
// Description  	验证器信息接口服务端
// Author  alittlexincan@163.com  2024/07/22 11:36
// Update  alittlexincan@163.com  2024/07/22 11:36
package endpoint

import (
	"context"
	_ "io/ioutil"
	_ "net/http"
	"strconv"

	"github.com/go-kit/kit/endpoint"
	"xincan.com.cn/tarot-go/internal/app/example/validation/dto"
	"xincan.com.cn/tarot-go/internal/app/example/validation/exception"
	"xincan.com.cn/tarot-go/internal/app/example/validation/service"
	rep "xincan.com.cn/tarot-go/internal/common/response"
	"xincan.com.cn/tarot-go/internal/components/middleware"
)

// MakeSearchValidationObjectEndpoint
// @Title    				MakeSearchValidationObjectEndpoint
// @Tags 					验证器管理
// @Summary   		 		对象验证
// @Description   		 	根据验证器ID查询验证器信息，并返回验证器详细信息
// @Auth      				alittlexincan@163.com         	2024/07/22 11:36
// @Update  				alittlexincan@163.com  			2024/07/22 11:36
// @Router 					/example/validation/object [get]
// @Accept 					application/x-www-form-urlencoded
// @Produce 				application/json
// @Param 		id		 	query 		string 		false 	"验证器ID" 	minlength(19) maxlength(19) 	required		default(1142681887794270208)
// @Param 		password	query 		string 		true 	"用户密码" 	minlength(6) maxlength(20) 		required		default(123456)
// @Success 	200 		{object} 	response.Result{data=[]vo.SearchValidationVo}									正常结果信息
// @Failure 	452 		{object} 	response.Result																	参数格式错误
// @Failure 	454 		{object} 	response.Result																	验证器不存在
// @Failure 	500 		{object} 	response.Result																	服务内部错误
func MakeSearchValidationObjectEndpoint(service service.ValidationInterface) endpoint.Endpoint {
	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
		model := request.(*dto.SearchValidationDto)

		_, err = strconv.ParseInt("id", 10, 64)
		if err != nil {
			// 第一种,记录异常方式, 推荐
			//return nil, exception.ErrSearchValidationFailed.WithError(err)

			// 第二种,记录异常方式,推荐
			//return nil, exception.NewValidationException(5003, "数据转化失败---").WithError(err)

			//return nil, exception.ErrSearchValidationFailed

			return nil, exception.ValidationExceptionBuilder().WithError(exception.ErrSearchValidationFailed, err)

			// 第四种,记录异常方式, 不建议, 无法记录堆栈
			//return rep.Failure(exception.ErrSearchValidationFailed.WithError(err)), nil
			// 第五种,记录异常方式, 不建议, 虽然可以记录错误堆栈, 但是违背了返回数据结构的规律
			//return exception.NewValidationException(50003, "数据转化失败---").WithError(err), nil
		}

		return service.SearchValidation(ctx, model)
	}
}

// MakeSearchValidationAttributeTransportEndpoint
// @Title    				MakeSearchValidationAttributeTransportEndpoint
// @Tags 					验证器管理
// @Summary   		 		属性验证-传输层
// @Description   		 	第一种: 在创建transport的时候, 在其内部进行验证, 返回exception.ErrInvalidParam
// @Auth      				alittlexincan@163.com         	2024/07/22 11:36
// @Update  				alittlexincan@163.com  			2024/07/22 11:36
// @Router 					/example/validation/attribute/transport [get]
// @Accept 					application/x-www-form-urlencoded
// @Produce 				application/json
// @Param 		id		 	query 		string 		false 	"验证器ID" 	minlength(19) maxlength(19) 		required		default(1142681887794270208)
// @Success 	200 		{object} 	response.Result{data=[]vo.SearchValidationVo}							正常结果信息
// @Failure 	452 		{object} 	response.Result															参数格式错误
// @Failure 	454 		{object} 	response.Result															验证器不存在
// @Failure 	500 		{object} 	response.Result															服务内部错误
func MakeSearchValidationAttributeTransportEndpoint(service service.ValidationInterface) endpoint.Endpoint {
	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
		model := request.(*dto.SearchValidationDto)

		_, err = strconv.ParseInt("id", 10, 64)
		if err != nil {
			// 第一种,记录异常方式, 推荐
			//return nil, exception.ErrSearchValidationFailed.WithMessage("数据转化失败---")
			// 第二种,记录异常方式,建议
			//return nil, exception.ErrSearchValidationFailed.WithError(err)
			// 第三种,记录异常方式, 建议
			//return nil, exception.ErrSearchValidationFailed
			// 第四种,记录异常方式, 不建议
			//return rep.Failure(exception.NewValidationException(exception.ErrSearchValidationFailed).WithError(err)), nil
			// 第五种,记录异常方式, 不建议
			//return exception.NewValidationException(exception.ErrSearchValidationFailed).WithError(err), nil
		}

		data, err := service.SearchValidation(ctx, model)
		if err != nil {
			return rep.Failure(err), nil
		}
		return rep.Success(data), nil
	}
}

// MakeSearchValidationAttributeEndpointEndpoint
// @Title    				MakeSearchValidationAttributeEndpointEndpoint
// @Tags 					验证器管理
// @Summary   		 		属性验证-端点层
// @Description   		 	第二种: 在创建endpoint的时候,  在其内部进行验证, 返回response.Failure
// @Auth      				alittlexincan@163.com         	2024/07/22 11:36
// @Update  				alittlexincan@163.com  			2024/07/22 11:36
// @Router 					/example/validation/attribute/endpoint [get]
// @Accept 					application/x-www-form-urlencoded
// @Produce 				application/json
// @Param 		id		 	query 		string 		false 	"验证器ID" 	minlength(19) maxlength(19) 		required		default(1142681887794270208)
// @Success 	200 		{object} 	response.Result{data=[]vo.SearchValidationVo}							正常结果信息
// @Failure 	452 		{object} 	response.Result															参数格式错误
// @Failure 	454 		{object} 	response.Result															验证器不存在
// @Failure 	500 		{object} 	response.Result															服务内部错误
func MakeSearchValidationAttributeEndpointEndpoint(service service.ValidationInterface) endpoint.Endpoint {
	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
		id := request.(int64)
		// 校验单值
		if err = middleware.ValidationAttribute(ctx, "[Endpoint] 验证器ID单值", id, "required,numeric,v-num-len=19"); err != nil {
			return rep.Failure(err), nil
		}
		return rep.Success(nil), nil
	}
}
